from typing import Optional, Union

from pydantic import ConfigDict, BaseModel, constr, field_validator, validator

from src.utils.get_today_time import get_today_time_start, get_today_time_end, get_n_day_before_today, \
    get_n_day_end_before_today


# 定义 pydantic 对象，用于数据验证与解析
class data_model_list(BaseModel):
    # 允许通过其他类实例来生成并初始化一个 Pydantic 实例
    model_config = ConfigDict(from_attributes=True)
    page: Optional[str]='1'
    size: Optional[str]='50'
    #类型,(订单管理):排序字段, create_time|pay_time | settle_time
    sort: Optional[str]=None
    #排序规则：0为不排序，1为正序，2为倒序
    order_by: Optional[str]='1'
    #达人标签,分两级,多级检索时中间用英文逗号隔开(视频号传分类id)
    label: Optional[str]=None
    #带货商品分类,分三级 逗号隔开;四级:1,2,3
    product_category: Optional[str]=None
    #带货方式 1 视频 2 直播;默认-1（视频号开通橱窗传1）
    bring_product_type: Optional[str]='-1'
    #带货口碑 4 无 3 低 2 中 1 高;默认传-1
    author_reputation_level:Optional[str]='-1'
    #商品价格区间 -10:1.0, 10-50:2.0, 50-100: 3.0, 100-500: 4.0, 500-10000: 5.0, 10000-: 6.0;默认填-1
    product_price: Optional[str]='-1'
    #搜索关键字
    keyword: Optional[str]=None
    #粉丝年龄段,值:-18；18-23；24-30；31-40；41-50；50-
    fans_age: Optional[str]=None
    #粉丝性别,0:男性居多,1:女性居多,2为全部
    fans_gender: Optional[str]='-1'
    #粉丝画像:地区,市;若fansCity有值,fansProvince不要传值
    fans_city: Optional[str]=None
    #粉丝直播价格偏向
    live_fans_buy_price: Optional[str]=None
    #粉丝直播购买意向
    live_buy_label: Optional[str]=None
    #粉丝视频购买意向
    aweme_buy_label: Optional[str]=None
    #粉丝视频价格偏向
    aweme_fans_buy_price: Optional[str]=None
    #达人年龄段,值:18-23 ；24-30 ；31-40 ；41-50 ； 50-
    authors_age: Optional[str]=None
    #达人性别,0:男性,1:女性,2未知;默认传-1
    authors_gender: Optional[str]='-1'
    #达人画像:地区,省
    authors_province: Optional[str]=None
    #达人画像:地区,市;若fansCity有值,fansProvince不要传值
    authors_city: Optional[str]=None
    #粉丝省份
    fans_province: Optional[str]=None
    #是否有联系方式 0 无 1 有,默认填-1
    is_have_contact: Optional[str]='-1'
    #直播场均销量
    live_sale: Optional[str]=None
    #销售额(带货水平)
    total_amount: Optional[str]=None
    #粉丝数
    follower_count: Optional[str]=None
    #平台,dy:抖音,xhs:小红书,ks:快手,sph视频号
    platform: Optional[str]
    #达人id
    author_id: Optional[str]=None
    #达人带货类型 1-品牌自播，2-店播，3-达人播
    bring_type:  Optional[str]=None
    #环比增长,默认0全部,1:增长30,2下降30
    comparison_type: Optional[str]='0'
    #达人标签
    tag_id: Optional[str]=None
    #媒介id
    user_id:Optional[Union[str, int]]=None
    #是否同时跟进,1是,2否
    is_many:Optional[str]=None
    #是否领样;1是,2否
    is_sample:Optional[str]=None
    # 参数用于选择近n天的数据，是成交数据的时间范围，是近2天，还是近n天内的成交数据,默认为-1即不填写数据
    cop_days_before: Optional[int] = -1
    # 因为一些数据核算，如果包含当天的话，会有数据波动，所以特意添加这个参数用来控制，就是日期结束范围不为当天晚上，而是往回走个一，两天，当输入1时即往前推一天
    deal_days_end: Optional[int] = 0
    # 参数用于选择近n天的数据，是成交数据的时间范围，是近2天，还是近n天内的成交数据,当需要再date日期里不输入时间戳而是输入诸如其他自定义格式数据时，为了避免触发检验器的检验，需要传入deal_days_before数据为None来关闭检验器
    deal_days_before: Optional[int] = 7
    #开始时间 10位时间戳，合作数据，近n天内的合作数据
    start_time: Optional[Union[str,int]]=None
    end_time:  Optional[Union[str,int]]=get_n_day_end_before_today()
    #默认-1,0建联中,1寄样中,2合作中
    cooperate_status: Optional[str]='-1'
    #业务,1带货,2内容
    classify: Optional[str]='1'
    #部门id,逗号隔开
    dept_id:Optional[Union[str,int]]=None
    #剩余天数,1:3天内,2:3-10天,3:10天以上
    last_day:Optional[str]=None
    #成交数据开始时间 10位时间戳:1715875200,1716479999
    start_date_time: Optional[Union[str,int]]=None
    end_date_time: Optional[Union[str,int]]=get_n_day_end_before_today()
    #是否是分配的,默认0不限制,1是,2否
    is_distribute: Optional[str]='0'
    #跟进筛选 0不限,1有跟进记录,2无跟进记录
    log_type: Optional[str]='0'
    #	0不限 1今日,-1昨日,-3近3天,-7近七天...
    log_days: Optional[str]='0'
    #默认0无筛选， 全或1,全且2,非3.未打标签4
    tag_type: Optional[str]='0'
    liked_collected_count: Optional[str]=None
    #订单状态UNCONFIRM:发货中 CONFIRM:确认收货 FAIL:交易失败 SUCCESS:交易成功
    status:Optional[str]=None
    #订单类型, author:达人带货 others:商家自卖;colonel:团长订单
    order_type:Optional[str]=None
    #店铺id
    shop_id:Optional[str]=None
    #达人关键词
    author_keyword:Optional[str]=None
    #团长关键词
    colonel_keyword:Optional[str]=None
    #活动id
    activity_id:Optional[str]=None
    #订单id
    order_id:Optional[str]=None
    #日期类型 create_date|pay_date | settle_date
    date_type:Optional[str]=None
    #开始时间
    start_date:Optional[str]=None
    #结束时间
    end_date:Optional[Union[str,int]]=get_n_day_end_before_today()
    #核算类型, checked:已核算 unchecked:未核算，author:达人已核算，colonel:团长已核算 多个值逗号,拼接在一起
    check_type:Optional[str]=None
    #合作单编号
    cooperation_sn:Optional[str]=None
    #带货方式 video:短视频、live:直播、shop_list:橱窗、others:其他
    media_type:Optional[str]=None
    #1 未认领订单
    unclaimed_order:Optional[int]=None
    #业绩类型 1达人业绩 2团长业绩
    achievement_type:Optional[int]=1
    #增长趋势 1只看增长 2只看下降
    increase_type:Optional[int]=0

    @validator('start_date_time',always = True)
    def compute_start_date_time(cls, v, values):
        if values['deal_days_before'] is not None:
            v= get_n_day_before_today(values['deal_days_before'])
            return v
        return v
    #开始时间
    @validator('start_date', always=True)
    def compute_start_date(cls, v, values):
        if values['deal_days_before'] is not None:
            v = get_n_day_before_today(values['deal_days_before'])
            return v
        return v

    # 开始时间
    @validator('start_time', always=True)
    def compute_start_time(cls, v, values):
        if values['deal_days_before'] is not None:
            v = get_n_day_before_today(values['deal_days_before'])
            return v
        return v

    #结束时间的检验器：往前推
    @validator('end_date', always=True)
    def compute_end_date(cls, v, values):
        if values['deal_days_end'] is not None:
            v = get_n_day_end_before_today(values['deal_days_end'])
            return v
        return v
        # 结束时间的检验器：往前推

    @validator('end_date_time', always=True)
    def compute_end_date_time(cls, v, values):
        if values['deal_days_end'] is not None:
            v = get_n_day_end_before_today(values['deal_days_end'])
            return v
        return v
        # 结束时间的检验器：往前推

    @validator('end_time', always=True)
    def compute_end_time(cls, v, values):
        if values['deal_days_end'] is not None:
            v = get_n_day_end_before_today(values['deal_days_end'])
            return v
        return v








